package ioc

import "github.com/gin-gonic/gin"

// 定义ioc对象(IocContainter)，也就是注册表
type IocContainter struct {
	// Ioc map[string]any
	// 改进
	Ioc map[string]IocObject
}

// // 通过函数的方式返回变量,能满足后期扩展的需要；直接引用变量也可以
// func Controller() *IocContainter {
// 	return controllerContainer
// }

// 负责初始化所有的对象,也就是把对象实例化
func (i *IocContainter) Init() {
	for _, v := range i.Ioc {
		v.Init()
	}
}

// // 定义一个全局变量作为此对象的实例
// var controllerContainer = &IocContainter{
// 	Ioc: map[string]IocObject{},
// }

// func (i *IocContainter) Registry(name string,obj any) {
// 	i.Ioc[name] = obj
// }
func (i *IocContainter) Registry(obj IocObject) {
	i.Ioc[obj.Name()] = obj
}

// func (i *IocContainter) Get(name string) any {
// 	return i.Ioc[name]
// }
func (i *IocContainter) Get(name string) IocObject {
	return i.Ioc[name]
}

// 扩展路由方法，把api handler对象注册到root router路由中
func (i *IocContainter) RouteRegistry(r gin.IRouter) {
	// 对Ioc中的IocObject做遍历
	for _, v := range i.Ioc {
		// 如何判断v是否为注册的api handler对象？做类型断言，所以此时要定义一个接口
		if a, ok := v.(GinApiHandler); ok {
			a.Registry(r)
		}
	}
}

// 为了满足类型断言的需要，api handler对象实现了Registry(r gin.IRouter)方法
type GinApiHandler interface {
	Registry(r gin.IRouter)
}
